package test2;

//1. 首先定义命令接收者，也就是具体要执行操作的对象，这里是电灯
class Light {
 public void turnOn() {
     System.out.println("灯已打开。");
 }

 public void turnOff() {
     System.out.println("灯已关闭。");
 }
}

//2. 定义命令接口，所有具体命令类都要实现这个接口
interface Command {
 void execute();
}

//3. 具体的开灯命令类，实现Command接口，并关联具体的接收者（Light）
class LightOnCommand implements Command {
 private Light light;

 public LightOnCommand(Light light) {
     this.light = light;
 }

 @Override
 public void execute() {
     light.turnOn();
 }
}

//4. 具体的关灯命令类，同样实现Command接口并关联Light
class LightOffCommand implements Command {
 private Light light;

 public LightOffCommand(Light light) {
     this.light = light;
 }

 @Override
 public void execute() {
     light.turnOff();
 }
}

//5. 定义遥控器类，它可以设置命令并执行命令
class RemoteControl {
 private Command command;

 public void setCommand(Command command) {
     this.command = command;
 }

 public void pressButton() {
     command.execute();
 }
}

//6. 测试命令模式
public class CommandPatternExample {
 public static void main(String[] args) {
     // 创建电灯对象，作为命令接收者
     Light light = new Light();

     // 创建开灯命令对象，并传入电灯对象
     LightOnCommand lightOnCommand = new LightOnCommand(light);

     // 创建关灯命令对象，同样传入电灯对象
     LightOffCommand lightOffCommand = new LightOffCommand(light);

     // 创建遥控器对象
     RemoteControl remoteControl = new RemoteControl();

     // 设置遥控器的命令为开灯命令，然后按下按钮执行命令
     remoteControl.setCommand(lightOnCommand);
     remoteControl.pressButton();

     // 设置遥控器的命令为关灯命令，再次按下按钮执行命令
     remoteControl.setCommand(lightOffCommand);
     remoteControl.pressButton();
 }
}